#include<stdio.h>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>

#define ROW 10   //行
#define COL 10   //列
#define NUM 10  //雷的个数
#define SIZE 30
int map[ROW + 2][COL + 2]; //这里的+2是为了增加外围一圈的一个缓存区使得游戏区内的元素更合理
IMAGE img[12];

void load()
{
    loadimage(&img[0], L"0.jpg", SIZE, SIZE);
    loadimage(&img[1], L"1.jpg", SIZE, SIZE);
    loadimage(&img[2], L"2.jpg", SIZE, SIZE);
    loadimage(&img[3], L"3.jpg", SIZE, SIZE);
    loadimage(&img[4], L"4.jpg", SIZE, SIZE);
    loadimage(&img[5], L"5.jpg", SIZE, SIZE);
    loadimage(&img[6], L"6.jpg", SIZE, SIZE);
    loadimage(&img[7], L"7.jpg", SIZE, SIZE);
    loadimage(&img[8], L"8.jpg", SIZE, SIZE);
    loadimage(&img[9], L"9.jpg", SIZE, SIZE);//雷
    loadimage(&img[10], L"10.jpg", SIZE, SIZE);//加謎
    loadimage(&img[11], L"11.jpg", SIZE, SIZE);//標記
}
//游戏初始化
void gameinit()
{
    //随机数
    srand(time(0));//根据时间改变随机
    for (int i = 0; i < ROW + 2; i++)
    {
        for (int j = 0; j < COL + 2; j++)
        {
            map[i][j] = 0;
        }
    }
    //让某一部分元素变成雷（随机每一行列为雷用-1表示雷）
    int n = NUM;
    while (n--)
    {
        int row = rand() % ROW + 1;//1到10
        int col = rand() % COL + 1;//随机在某一行某一列

        if (map[row][col] == 0)//这行没有埋雷
            map[row][col] = -1;//改成雷

    }
    for (int i = 1; i <= ROW; i++)
    {
        for (int j = 1; j <= COL; j++)
        {
            if (map[i][j] != -1) //以这个不为-1的数为中心的几个数中-1的个数
            {
                for (int i1 = i - 1; i1 <= i + 1; i1++)
                {
                    for (int j1 = j - 1; j1 <= j + 1; j1++)
                    {
                        if (map[i1][j1] == -1)
                            map[i][j]++;
                    }
                }
            }
        }
    }
    //每一个元素都+20 游戏
    for (int i = 1; i <= ROW; i++)
    {//这样做是为了让扫雷时只要减去20就可以知道里面的数
        for (int j = 1; j <= COL; j++)
        {
            map[i][j] += 20;
        }
    }
}

//游戏的绘制函数
void gamepaint()
{
    for (int i = 1; i <= ROW; i++)//行
    {
        for (int j = 1; j <= COL; j++)//列
        {
            if (map[i][j] >= 0 && map[i][j] <= 8)//数字
            {
                putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[map[i][j]]);
                 //(j-1)表示列的坐标 ，(i-1)表示行的坐标(坐标从零开始）
            }
            else if (map[i][j] == -1)//雷
            {
                putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[9]);
            }
            else if (map[i][j] >= 19 && map[i][j] <= 28)//加密
            {
                //这里就是把打印变成了更换图片的操作，（及用图片代替）
                putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[10]);
                //在这里插入img[10]这张图
                //(j-1)表示列的坐标 ，(i-1)表示行的坐标(坐标从零开始）
            }
            else if (map[i][j] >= 40)//标记
            {
                putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[11]);
            }
        }
        printf("\n");
    }
}

//游戏的规则
int gameplay()
{
    //最前面加密的格子
    //从零到八的数字
    //小旗子（用来标记雷）
    //雷
    MOUSEMSG msg = { 0 };//鼠标操作
    msg = GetMouseMsg();
    if (msg.uMsg == WM_LBUTTONDOWN)//鼠标左键操作
    {
        //现在数字是加密的为19到28，左键解密操作
        int r = msg.y / SIZE + 1;//得到行
        int c = msg.x / SIZE + 1;//列
        if(map[r][c]>=19&&map[r][c]<=28)//只有在元素是被加密时才进行解码操作
        map[r][c] -= 20;//解码
        return map[r][c];//-1 点到雷了
    }
    else if (msg.uMsg == WM_RBUTTONDOWN)
    {
        int r = msg.y / SIZE + 1;//得到行
        int c = msg.x / SIZE + 1;//列
        if (map[r][c] >= 19 && map[r][c] <= 28)//只有在元素是被加密
            map[r][c] += 100;//加密到旗子
        else if (map[r][c] >= 40)
            map[r][c] -= 40;
        return map[r][c];

    }
}
int main()
{
    initgraph(COL*SIZE,ROW*SIZE);  //整个大盒子
    load();     //输入图片数据
    gameinit();   //初始化操作
    while(1)      //多次遍历直到点到雷为止
    {
    gamepaint();
    if (gameplay()==-1)  //点到雷了
    {
        gamepaint();  //最后再显示一下；
        break;
    }
    }
    getchar();  //显示点到雷的图片
    return 0;
}
